package com.grandtech.insurance.dao.app;

import com.mongodb.client.result.UpdateResult;
import org.springframework.data.domain.Page;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;

import java.util.List;


public interface MongoDao<T> {

    public void setMongoTemplate(MongoTemplate template);

    /**
     * 判断集合是否存在
     *
     * @param collectName
     * @return
     */
    public boolean existCollect(String collectName);

    /**
     * 判断集合是否存在
     *
     * @param collectName
     * @return
     */
    public boolean createCollect(String collectName);

    /**
     * 判断集合是否存在
     *
     * @param collectName
     * @param index
     * @return
     */
    public boolean existIndex(String collectName, String index);

    /**
     * 创建集合
     *
     * @param entity
     * @param collectName
     * @return
     */
    public boolean createCollect(T entity, String collectName);

    /**
     * 创建索引
     *
     * @param clazz
     * @param collectName
     * @return
     */
    public boolean createIndex(Class clazz, String collectName);


    /**
     * @param entity
     */
    public void insert(T entity);

    /**
     * @param entity
     * @param collectName
     */
    public void insert(T entity, String collectName);

    public void insert(List<T> list, Class clazz);

    public void insert(List<T> list, String collectName);

    /**
     * 插入
     */
    public T save(T entity);

    /**
     * 插入或新增
     *
     * @param query
     * @param collectName
     */
    public void saveOrUpdate(T entity, Query query, String collectName);

    /**
     * 插入
     */
    public T save(T entity, String collectName);

    public void save(List<T> list, String collectName);

    /**
     * 根据ID查询
     */
    public T findById(String id);


    /**
     * 通过ID获取记录,并且指定了集合名(表的意思)
     */
    public T findById(String id, String collectionName);

    /**
     * 通过Query获取记录,并且指定了集合名(表的意思)
     */
    public T findTByQuery(Query query, Class clazz, String collectionName);

    /**
     * 通过Query获取记录,并且指定了集合名(表的意思)
     */
    public T findTByQuery(Query query, Class clazz);

    /**
     * 获得所有该类型记录
     */
    public List<T> findAll();


    /**
     * 获得所有该类型记录,并且指定了集合名(表的意思)
     */
    public List<T> findAll(String collectionName);


    /**
     * 根据条件查询
     */
    public List<T> find(Query query);


    /**
     * 根据条件查询一个
     */
    public T findOne(Query query);


    /**
     * 分页查询
     */
    public Page<T> findPage(Page<T> page, Query query);


    /**
     * 根据条件 获得总数
     */
    public long count(Query query);


    /**
     * 根据条件 更新
     */
    public UpdateResult update(Query query, Update update);


    /**
     * 更新符合条件并sort之后的第一个文档 并返回更新后的文档
     */


    public T updateOne(Query query, Update update);


    /**
     * 根据传入实体ID更新
     */
    public UpdateResult update(T entity);


    /**
     * 根据条件 删除
     *
     * @param query
     */
    public void remove(Query query);


}
